﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.CultivosNumeros
{
	public class CultivosNumeroService
		: ICultivosNumeroService
	{
		#region Private properties

		private ICultivosNumeroRepository _cultivosNumeroRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivosNumeroRepository"></param>
		public CultivosNumeroService(ICultivosNumeroRepository cultivosNumeroRepository)
		{
			if (cultivosNumeroRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "cultivosNumerosRepository");
			_cultivosNumeroRepository = cultivosNumeroRepository;
		}

		#endregion

		#region ICultivosNumeroService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivosNumero"></param>
		public void AddCultivosNumero(Entities.CultivosNumero cultivosNumero)
		{
			if (cultivosNumero == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "cultivosNumero");
			IUnitOfWork unitOfWork = _cultivosNumeroRepository.StoreContext;
			_cultivosNumeroRepository.Add(cultivosNumero);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivosNumero"></param>
		public void ChangeCultivosNumero(Entities.CultivosNumero cultivosNumero)
		{
			if (cultivosNumero == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "cultivosNumero");
			IUnitOfWork unitOfWork = _cultivosNumeroRepository.StoreContext;
			_cultivosNumeroRepository.Modify(cultivosNumero);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		public List<Entities.CultivosNumero> FindAllCultivosNumeros()
		{
			return _cultivosNumeroRepository.GetAll().OrderBy(n => n.Nombre).ToList();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="status"></param>
		/// <returns></returns>
		public List<Entities.CultivosNumero> FindCultivosNumerosByStatus(bool status = true)
		{
			CultivosNumerosByStatusSpecification specification = new CultivosNumerosByStatusSpecification(status);
			return _cultivosNumeroRepository.GetBySpec(specification).OrderBy(n => n.Nombre).ToList();
		}

		#endregion

		#region IDisposable Members

		public void Dispose()
		{
			if (_cultivosNumeroRepository != null && _cultivosNumeroRepository.StoreContext != null)
				_cultivosNumeroRepository.StoreContext.Dispose();
		}

		#endregion
	}
}